package client.ui;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;

import javax.swing.*;

import common.JTreeExplorer;

/**
 * La fenêtre principale de l'application cliente.
 */
@SuppressWarnings("serial")
public class Window extends JFrame {

	/**
	 * L'explorateur arborescent de fichiers coté client
	 */
	private JTreeExplorer _clientExplorer;
	
	/**
	 * Un scroll pane de l'arborescence cliente
	 */
	private JScrollPane _clientExplorerScrollPane;
	
	/**
	 * L'explorateur arborescent de fichiers coté serveur
	 */
	private JTreeExplorer _serverExplorer;
	
	/**
	 * Un scroll pane de l'arborescence serveur
	 */
	private JScrollPane _serverExplorerScrollPane;
	
	/**
	 * Le titre au dessus de l'explorateur de fichier coté client.
	 */
	private JLabel _L_clientExplorerTitle;
	
	/**
	 * Le titre au dessus de l'explorateur de fichier coté serveur.
	 */
	private JLabel _L_serverExplorerTitle;
	
	/**
	 * Une barre d'avancement placée en bas de la fenêtre pour les opérations asynchrones
	 */
	private JProgressBar _PB_async;
	
	/**
	 * Un label pour indiquer la progression de la tache asynchrone courante.
	 */
	private JLabel _L_progress;
	
	/**
	 * Bouton de synchronisation
	 */
	private JButton _B_synchronize;
	
	/**
	 * Bouton de connexion
	 */
	private JButton _B_connection;
	
	/**
	 * Bouton de rafraichissement des dossiers clients
	 */
	// private JButton _B_refresh;
	
	/**
	* Bouton de choix du répertoire racine sur le serveur pour la synchronisation.
	*/
	private JButton _B_chooseRootFolder;
	
	/**
	 * Le chemin actuellement sélectionné (et qui est synchronisé lors d'un clic sur le bouton de synchronisation)
	 */
	private JTextField _TF_currentPath;
	
	/**
	 * Crée une nouvelle fenêtre
	 */
	public Window()
	{
		super();
		build();
	}
	
	/**
	 * Construit la fenêtre et dispose les composants graphiques.
	 */
	private void build()
	{
		/*
		 *  Application du look and feel du système.
		 *  Commenter la méthode UIManager.setLookAndFeel(...) pour
		 *  revenir au style Java par défaut (généralement moins beau).
		 *  
		 *  Note: cette méthode doit être appelée avant toute instanciation
		 *  de composants graphiques, sinon les composants gardent leur look
		 *  and feel Java
		 */
		try {
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (UnsupportedLookAndFeelException e) {
			e.printStackTrace();
		}
		
		/* =======================
		 * 
		 * 	PANNEAUX DE COMMANDES
		 *  
		 * =======================
		 */
		
		// La barre de commandes en haut de la fenetre
		_B_connection = new JButton("Connexion");
		_B_chooseRootFolder = new JButton("Dossier racine...");
		// _B_refresh = new JButton("Rafraichir");
		
		Box hBox_commands = Box.createHorizontalBox();
		hBox_commands.add(_B_chooseRootFolder);
		hBox_commands.add(Box.createHorizontalStrut(10));
		// hBox_commands.add(_B_refresh);
		hBox_commands.add(Box.createHorizontalGlue());
		// hBox_commands.add(_B_connection);
		
		// La barre de synchronisation
		_TF_currentPath = new JTextField();
		_TF_currentPath.setMaximumSize(new Dimension(Short.MAX_VALUE, _TF_currentPath.getPreferredSize().height));
		_B_synchronize = new JButton("Synchroniser");
		
		Box hBox_synchronize = Box.createHorizontalBox();
		hBox_synchronize.add(_B_synchronize);
		hBox_synchronize.add(_TF_currentPath);

		/* ============================
		 * 
		 * 	EXPLORATEURS DE FICHIERS 
		 *  
		 * ============================
		 */
		
		// Le titre de l'explorateur de fichiers client
		_L_clientExplorerTitle = new JLabel("Arborescence locale :");
		
		// Explorateur arborescent de fichiers pour le coté client
		_clientExplorer = new JTreeExplorer(System.getProperty("user.home"));
		_clientExplorerScrollPane = new JScrollPane(_clientExplorer);
		
		// Titre + explorateur client
		Box vBox_clientExplorer = Box.createVerticalBox();
		vBox_clientExplorer.add(_L_clientExplorerTitle);
		vBox_clientExplorer.add(_clientExplorerScrollPane);
		
		// Le titre de l'explorateur de fichiers serveur
		_L_serverExplorerTitle = new JLabel("Arborescence distante :");
		
		// Explorateur arborescent de fichiers pour le coté serveur
		_serverExplorer = new JTreeExplorer("");
		_serverExplorerScrollPane = new JScrollPane(_serverExplorer);
		
		// Titre + explorateur client
		Box vBox_serverExplorer = Box.createVerticalBox();
		vBox_serverExplorer.add(_L_serverExplorerTitle);
		vBox_serverExplorer.add(_serverExplorerScrollPane);
		
		// Le panneau de séparation extensible pour les deux arborescences (client / serveur)
		JSplitPane explorerSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, vBox_clientExplorer, vBox_serverExplorer);
		
		// La boite des arborescences (utile pour que toute la largeur de la fenetre soit occupée)
		Box hBox_explorers = Box.createHorizontalBox();
		hBox_explorers.add(explorerSplitPane);
		
		
		/* ===================================
		 * 
		 * 	BARRE DES TACHES / NOTIFICATIONS 
		 *  
		 * ===================================
		 */
		
		// Label de notification
		_L_progress = new JLabel("Avancement ");
		
		// Barre  d'avancement
		_PB_async = new JProgressBar();
		_PB_async.setMaximum(100);
		_PB_async.setValue(0);
		
		// La barre de notification en bas de la fenetre.
		Box hBox_notification = Box.createHorizontalBox();
		hBox_notification.add(_L_progress);
		hBox_notification.add(_PB_async);
		
		/* ===================================
		 * 
		 * 	FENETRE GLOBALE
		 *  
		 * ===================================
		 */
		
		// Boite principale
		Box vBox_principale = Box.createVerticalBox();
		vBox_principale.add(hBox_commands);
		vBox_principale.add(Box.createVerticalStrut(10)); // Espacement vertical de 10 pixels
		vBox_principale.add(hBox_explorers);
		vBox_principale.add(Box.createVerticalStrut(10)); // Espacement vertical de 10 pixels
		vBox_principale.add(hBox_synchronize);
		vBox_principale.add(Box.createVerticalStrut(10)); // Espacement vertical de 10 pixels
		// vBox_principale.add(hBox_notification);
		
		// Fermeture de l'application lorsque la fenêtre est fermée.
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setTitle("Synchronisation des fichiers");
		setSize(getBaseWidth(),getBaseHeight());
		setLocationRelativeTo(null);
		
		Container c = getContentPane();	// Récupère la zone cliente de la frame (zone dans laquelle on peut placer des composants/conteneurs)
        c.add(vBox_principale,BorderLayout.CENTER);	// Place la boite principale dans la fenêtre
	}
	
	/**
	 * La largeur initiale de la fenêtre
	 * @return
	 * 640
	 */
	public int getBaseWidth()
	{
		return 500;
	}
	
	/**
	 * La hauteur initiale de la fenêtre
	 * @return
	 * 480
	 */
	public int getBaseHeight()
	{
		return 430;
	}

	public JTreeExplorer get_clientExplorer() {
		return _clientExplorer;
	}

	public JScrollPane get_clientExplorerScrollPane() {
		return _clientExplorerScrollPane;
	}

	public JTreeExplorer get_serverExplorer() {
		return _serverExplorer;
	}

	public JScrollPane get_serverExplorerScrollPane() {
		return _serverExplorerScrollPane;
	}

	public JLabel get_L_clientExplorerTitle() {
		return _L_clientExplorerTitle;
	}

	public JLabel get_L_serverExplorerTitle() {
		return _L_serverExplorerTitle;
	}

	public JProgressBar get_PB_async() {
		return _PB_async;
	}

	public JLabel get_L_progress() {
		return _L_progress;
	}

	public JButton get_B_synchronize() {
		return _B_synchronize;
	}

	public JButton get_B_connection() {
		return _B_connection;
	}

	public JButton get_B_chooseRootFolder() {
		return _B_chooseRootFolder;
	}

	public JTextField get_TF_currentPath() {
		return _TF_currentPath;
	}
	
	public void set_clientExplorer(JTreeExplorer _clientExplorer) {
		this._clientExplorer = _clientExplorer;
	}

	public void set_serverExplorer(JTreeExplorer _serverExplorer) {
		this._serverExplorer = _serverExplorer;
	}
	
}
